#include <iostream>

using namespace std;

/*
 * 函数对象
 *      重载函数调用操作符的类，其对象常称为函数对象
 *      函数对象使用重载的()时，行为类似函数调用，也叫仿函数
 *   本质     函数对象(仿函数)是一个类，不是一个函数
 *   特点   1、函数对象在使用时，可以像普通函数一样调用，可以有参数、返回值
 *         2、函数对象超出普通函数的概念，函数对象可以有自己的状态   利用函数属性值记录
 *         3、函数对象可以作为参数传递
 */

class MyAdd{
public:
    int operator()(int v1, int v2){
        return v1+v2;
    }
};

void test01(){
    MyAdd myAdd;
    cout << myAdd(1, 2) << endl;
}

class MyPrint{
public:
    void operator()(string & s){
        cout << s << endl;
    }
};

void doPrint(MyPrint & m, string s){
    m(s);
}

void test02(){
    MyPrint myPrint;

    doPrint(myPrint, "hello");

}

int main() {

    test01();

    test02();

    return 0;
}
